package main

import (
	"fmt"
	"io"
	"net"
	"os"
)

// 1 先运行 05_sender.go , 2 再运行 05_receiver.go  3 在 05_sender 中输入文件根路径进行文件传输

/**
	1 接收方先监听7777端口,保证传输通道,持续监听
	2 当有信息传递过来时，按约定先接收文件名称
	3 名称接收无误后，相应被监听程序"ok"信息
	4 再按约定,接收文件资源,并写入当前文件名的文件中
	5
**/

func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:7777")
	if err != nil {
		fmt.Println(" listen-err = ", err)
		return
	}
	defer listener.Close()

	connection, conErr := listener.Accept()
	if conErr != nil {
		fmt.Println(" accept-Err = ", conErr)
		return
	}

	buf := make([]byte, 1024)
	index, err := connection.Read(buf)
	if err != nil {
		fmt.Println(" read-Err = ", err)
		return
	}

	fileName := string(buf[:index])

	// 回复 "ok" , 接收文件
	connection.Write([]byte("ok"))

	receiveFile(fileName, connection)

}

func receiveFile(fileName string, conn net.Conn) {
	f, err := os.Create(fileName)
	if err != nil {
		fmt.Println(" create-Err = ", err)
		return
	}
	buf := make([]byte, 1024*4)
	for {
		n, err := conn.Read(buf)
		if err != nil {
			if err == io.EOF {
				fmt.Println("文件接收完毕")
			} else {
				fmt.Println(" receive-read-Err = ", err)
			}
			return
		}
		if n == 0 {
			fmt.Println("n == 0 文件接收完毕")
			break
		}
		f.Write(buf[:n])
	}

}
